package com.quartzd.core.client;

import com.quartzd.core.annotation.QuartzCreate;
import com.quartzd.core.annotation.QuartzRemove;
import com.quartzd.core.config.QuartzConfig;
import com.quartzd.util.Func;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springframework.stereotype.Component;

/**
 * 描述：调度器客户端
 *
 * @author huxuehao
 **/
@Slf4j
@Component
public class QuartzClient {
    /**
     * 创建添加定时任务
     *
     * @param config 任务参数
     */
    @QuartzCreate
    public QuartzConfig create(QuartzConfig config) {
        if (Func.isEmpty(config.getCron())) {
            QuartzScript.createOnceJob(config, false);
        } else {
            QuartzScript.createCronJob(config);
        }
        return config;
    }

    /**
     * 创建添加定时任务,仅执行一次
     *
     * @param config 任务参数
     * @param force  是否强制执行
     *               true: 无论定时任务是否存在都会执行
     *               false：若定时任务存在，则不会执行
     */
    public String createOnce(QuartzConfig config, boolean force) {
        QuartzScript.createOnceJob(config, force);
        return config.getIdentity();
    }

    /**
     * 修改定时任务Cron规则
     *
     * @param config   任务参数
     */
    @QuartzCreate
    public QuartzConfig updateCron(QuartzConfig config) {
        if (QuartzScript.isValidCron(config.getCron())) {
            QuartzScript.updateCron(config.getTriggerName(), config.getTriggerGroupName(), config.getCron());
        } else {
            throw new RuntimeException("Cron ["+config.getCron()+"] 存在问题");
        }
        return config;
    }

    /**
     * 移除定时任务
     *
     * @param config 任务参数
     */
    @QuartzRemove
    public QuartzConfig remove(QuartzConfig config) {
        // 定时任务不存在就不处理
        String triggerState = QuartzScript.getTriggerState(config);
        if (Trigger.TriggerState.NONE.name().equals(triggerState)) {
            return null;
        }
        QuartzScript.removeJob(config);
        return config;
    }
}
